import store from "@/store"

// 需要登录的页面
const authUrls = ['Checkout', 'Orders', 'Cart', 'Address', 'AddressEdit',
  'AddAddress', 'Arders', 'ArderDetail', 'My']

// 需要拦截的 tabBar 页面
const tabBar = ['Cart', 'My']

const methods = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab']
methods.forEach(method => {
  uni.addInterceptor(method, {
    invoke(options) {
      const url = options.url.split('?')[0]
      // 提取页面标识：将 /pages/Cart/Cart 转换为 Cart
      const pageKey = url.split('/')
        .filter(Boolean)          // 过滤空字符串
        .pop()                    // 取最后一段路径

      // 如果不是需要登录的页面则直接放行(包括登录页也会直接放行)
      if (!authUrls.includes(pageKey)) return true

      const token = store.getters.token
      // 如果有 token 则说明已经登录过，直接放行
      if (token) return true

      // 如果没有 token 则需要先登录
      return new Promise(() => {
        uni.showModal({
          title: '温馨提示',
          content: '此时需要先登录才能继续操作哦',
          confirmText: '去登录',
          cancelText: '再逛逛',
          success(res) {
            // 这个也有个坑，用户点击取消还是确认都会触发 success，只有模态框调用失败才会触发 fail
            if (res.confirm) {
              // 如果 options.url 是 undefined，就传递空字符串，不能 encodeURIComponent(undefined)
              // encodeURIComponent(undefined) 的结果会是 ‘undefined’ 字符串，坑中坑
              const toUrl = options.url ? encodeURIComponent(options.url) : ''
              const isTabBar = tabBar.includes(pageKey) || ''

              uni.navigateTo({
                url: `/pages/Login/Login?toUrl=${toUrl}&isTabBar=${isTabBar}`,
              })
            }
          }
        })
      })
    }
  })
})
